package com.cn.jm.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @author
 * @description 文件压缩
 * @date 2020/4/29
 */
public class ZipUtils {

    /**
     *  
     *  * @Description 
     *  * @author xukaixun
     *  * @param zipSavePath   压缩好的zip包存放路径
     *  * @param sourceFile待压缩的文件（单个文件或者整个文件目录）
     *  * @return  
     *  
     */
    public static void zipCompress(String zipSavePath, File sourceFile) {
        try {
            //创建zip输出流
            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipSavePath));
            compress(zos, sourceFile, sourceFile.getName());
            zos.close();
        } catch (Exception e) {

        }
    }

    private static void compress(ZipOutputStream zos, File sourceFile, String fileName) throws Exception {
        if (sourceFile.isDirectory()) {
            //如果是文件夹，取出文件夹中的文件（或子文件夹）
            File[] fileList = sourceFile.listFiles();
            if (fileList.length == 0)//如果文件夹为空，则只需在目的地zip文件中写入一个目录进入点
            {
                zos.putNextEntry(new ZipEntry(fileName + "/"));
            } else//如果文件夹不为空，则递归调用compress，文件夹中的每一个文件（或文件夹）进行压缩
            {
                for (File file : fileList) {
                    compress(zos, file, fileName + "/" + file.getName());
                }
            }
        } else {
            if (!sourceFile.exists()) {
                zos.putNextEntry(new ZipEntry("/"));
                zos.closeEntry();
            } else {
                //单个文件，直接将其压缩到zip包中
                zos.putNextEntry(new ZipEntry(fileName));
                FileInputStream fis = new FileInputStream(sourceFile);
                byte[] buf = new byte[1024];
                int len;
                //将源文件写入到zip文件中
                while ((len = fis.read(buf)) != -1) {
                    zos.write(buf, 0, len);
                }
                zos.closeEntry();
                fis.close();
            }
        }
    }

    /**
     * 删除文件或文件夹
     * @param directory
     */
    public static void delAllFile(File directory){
        if (!directory.isDirectory()){
            directory.delete();
        } else{
            File [] files = directory.listFiles();

            // 空文件夹
            if (files.length == 0){
                directory.delete();
                System.out.println("删除" + directory.getAbsolutePath());
                return;
            }

            // 删除子文件夹和子文件
            for (File file : files){
                if (file.isDirectory()){
                    delAllFile(file);
                } else {
                    file.delete();
                    System.out.println("删除" + file.getAbsolutePath());
                }
            }

            // 删除文件夹本身
            directory.delete();
            System.out.println("删除" + directory.getAbsolutePath());
        }
    }
}
